/**
 * @file tfparser.h
 * @brief Парсер для файла исходных данных.
 * @version 0.1
 * @copyright MIT License
 * @author А.В. Лепихов
 * @date 2012
 */

#ifndef _TFPARSER_H_
#define _TFPARSER_H_

#include <cstdio>
#include <string>
#include <vector>

#include <math_addons.h>

using namespace std;

#ifndef NULL_VALUE
	/** Пустое значение. */
	#define NULL_VALUE	(-1)
#endif

/** Максимальная длина команды в байтах */
#define COMMAND_MAX_LEN		(32)
/** Максимальная длина комментария в байтах */
#define COMMENT_MAX_LEN		(10000)

/** Предоставляет инструменты управления файлом исходных данных. */
class TextFileParser {
	/** Дескриптор файла-эхо для вывода всей считываемой информации. */
	FILE* fOut;
	/** Дескриптор файла с исходными данными. */
	FILE* fIn;
	/** Строка для хранения коментариев. */
	char params[COMMENT_MAX_LEN];
	/** Строка для хранения команды. */
	char command[COMMAND_MAX_LEN];
	/** Формат строки, предшествующей параметру. */
	string fmt;
public:
	/**
	 * @brief Прочитать последовательность вещественных чисел из строки параметров.
	 * @details Считывание выполняется с текущей позиции в строке.
	 * @param count - количество считываемых чисел.
	 * @return Вектор вещественных чисел.
	 */
	vector<double> GetDoubleParamsArray(int count);
	/**
	 * @brief Прочитать последовательность целых чисел из строки параметров.
	 * @details Считывание выполняется с текущей позиции в строке.
	 * @param count - количество считываемых чисел.
	 * @return Вектор целых чисел.
	 */
	vector<int> GetIntParamsArray(int count);
	
	/**
	 * @brief Считать таблицу интерполяционной функции из файла ИД.
	 * @param func - указатель на дескриптор таблицы.
	 * @return Результат операции. NULL_VALUE - ошибка при считывании.
	 */
	int GetInterpolationFunc(func_points_t* func);
	
	/**
	 * @brief Прочитать последовательность слов из строки параметров.
	 * @details Считывание выполняется с текущей позиции в строке. Слово - набор символов кроме пробела или табуляции.
	 * @param count - количество считываемых слов.
	 * @return Вектор слов.
	 */
	vector<string> GetStringParamsArray(int count);
	/**
	 * @brief Прочитать следующую команду.
	 * @details Перейти на следующую строку, считать команду, считать строку параметров, сбросить параметр fmt.
	 */
	char* GetNextCommand();
	/**
	 * @brief Выдать следующее вещественное число двойной точности из потока, заданного файловым дескриптором.
	 * @details В случае ошибки будет выдано значение NULL_VALUE.
	 * @sa NULL_VALUE
	 */
	double GetNextDouble();
	/**
	 * @brief Выдать следующее целое число из потока, заданного файловым дескриптором.
	 * @details В случае ошибки будет выдано значение NULL_VALUE.
	 * @sa NULL_VALUE
	 */
	int GetNextInt();
	/**
	 * @brief Выдать следующую строку из потока, заданного файловым дескриптором.
	 * @details В случае ошибки будет возвращено значение NULL_VALUE, параметр str не изменится.
	 * @return 0, в случае успешного завершения.
	 * @sa NULL_VALUE
	 */
	int GetNextString(string* str);
	/**
	 * @brief Конструктор класса.
	 * @param fin - файл с исходными данными для разбора.
	 * @param fout - файл-эхо, в который выводятся все считываемые параметры. По-умолчанию - консоль.
	 */
	TextFileParser(FILE* fin, FILE* fout = 0);
	/** Деструктор класса. */
	~TextFileParser();
};

#endif /* _TFPARSER_H_ */

